﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace CDStore3Tiers
{
    public class XuLyDiaNhac
    {
        static StoreCDDataContext dt;

        /// <summary>
        /// Lấy danh sách giảm giá
        /// </summary>
        /// <returns>trả về danh sách giảm giá</returns>
        public XuLyDiaNhac()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
        }
        /// <summary>
        /// Tìm kiếm đĩa theo mã
        /// </summary>
        /// <param name="DH">danh sách đĩa nhạc</param>
        /// <param name="ma">mã tìm kiếm</param>
        /// <returns></returns>
        public static List<vwDiaNhac> DanhSachDia_Tim(List<vwDiaNhac> DH, String ma)
        {
            ma = ma.ToLower();
            return DH.Where(c => c.TenDia.ToString().ToLower().Contains(ma) ||
                c.MaDia.ToString().ToLower().Contains(ma)).ToList<vwDiaNhac>();
        }
        /// <summary>
        /// Tìm kiếm đĩa theo mã
        /// </summary>
        /// <param name="DH">danh sách đĩa nhạc</param>
        /// <param name="ma">mã tìm kiếm</param>
        /// <returns></returns>
        public static List<vwDiaNhac> DanhSachDia_Ma(int ma)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<vwDiaNhac> dia = new List<vwDiaNhac>();
            dia = (from d in dt.vwDiaNhacs
                   where d.MaDia == ma
                   select d).ToList<vwDiaNhac>();

            return dia;
        }
        /// <summary>
        /// Lay dia nhac theo ten dia nhac.
        /// </summary>
        /// <param name="ten">tên dia nhac</param>
        /// <returns>Ðia nhac ket qua</returns>

        public static List<vwDiaNhac> DanhSachDia_Ten(String ten)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<vwDiaNhac> dia = new List<vwDiaNhac>();
            dia = (from d in dt.vwDiaNhacs
                   where d.TenDia == ten
                   select d).ToList<vwDiaNhac>();

            return dia;

        }
        /// <summary>
        /// Lấy danh sách giảm giá
        /// </summary>
        /// <returns>danh sách giảm giá</returns>
        public static List<DSGiamGia> LayDSGiamGia()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<DSGiamGia> ListGiamGia = new List<DSGiamGia>();
            ListGiamGia = (from n in dt.DSGiamGias
                           select n).ToList<DSGiamGia>();
            return ListGiamGia;
        }

        /// <summary>
        /// Lấy danh sách sự kiện
        /// </summary>
        /// <returns>Trả về danh sách sự kiện</returns>
        public static List<SuKien> LayDSSuKien()
        {
            List<SuKien> kq = (from g in dt.SuKiens
                               select g).ToList<SuKien>();

            return kq;
        }
        /// <summary>
        /// Kiểm tra một ngày có xảy ra sự kiện hay không
        /// </summary>
        /// <param name="ngay">ngày cần kiểm tra</param>
        /// <returns>sự kiện</returns>
        public static SuKien KiemTraNgay_SuKien(DateTime ngay)
        {
            List<SuKien> ListSuKien = new List<SuKien>();
            ListSuKien = LayDSSuKien();
            SuKien sk = new SuKien();
            sk = ListSuKien[0];

            for (int i = 0; i <= ListSuKien.Count - 1; i++)
            {
                if (ngay.Day >= ListSuKien[i].NgayBD.Day && ngay.Month >= ListSuKien[i].NgayBD.Month && ngay.Year >= ListSuKien[i].NgayBD.Year && ngay.Day <= ListSuKien[i].NgayKT.Day && ngay.Month <= ListSuKien[i].NgayKT.Month && ngay.Year <= ListSuKien[i].NgayKT.Year)
                    sk = ListSuKien[i];

            }
            return sk;
        }
        /// <summary>
        /// Kiểm tra một đĩa nhạc có nằm trong danh sách giảm giá khi xảy ra sự kiện nào đó không
        /// </summary>
        /// <param name="ma">mã đĩa</param>
        /// <param name="sk">mã sự kiện</param>
        /// <returns>True nếu mã đĩa  (ma) được giảm giá khi xảy ra sự kiện sk và trả về False nếu ngược lại</returns>
        public static bool KiemTraMaDia_GiamGia(int ma, int sk)
        {
            bool kq = false;
            List<DSGiamGia> ListGiamGia = new List<DSGiamGia>();
            ListGiamGia = XuLyDiaNhac.LayDSGiamGia();
            for (int i = 0; i <= ListGiamGia.Count - 1; i++)
            {
                if (ma == ConvertType.ToInt(ListGiamGia[i].MaDia) && sk == ConvertType.ToInt(ListGiamGia[i].MaSK))
                    kq = true;
            }
            return kq;
        }
        /// <summary>
        /// Kiểm tra một bài hát đã có trong đĩa chưa
        /// </summary>
        /// <param name="ma">mã đĩa</param>
        /// <param name="val">mã bài hát đưa vào kiểm tra</param>
        /// <returns>Trả về True nếu tồn tại và False nếu ngược lại</returns>
        public bool TonTai(string ma, string val)
        {
            if (dt.BaiHat_DiaNhacs.Where(b => b.MaDia.Equals(ma) && b.MaBH.Equals(val)).Count() > 0)
            {
                return true;
            }
            else return false;
        }
        /// <summary>
        /// Tìm kiếm một đĩa nhạc trên DataGridView hiển thị danh sách đĩa nhạc.
        /// </summary>
        /// <param name="dgv">DataGridView hiển thị danh sách đĩa nhạc.</param>
        /// <param name="a">Chuỗi đưa vào kiểm tra.</param>
        public void TimKiem(DataGridView dgv, string a)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            dgv.DataSource = from n in dt.vwDiaNhacs
                             where n.MaDia.ToString().ToLower().Contains(a.ToLower())
                                 || n.TenDia.ToLower().Contains(a.ToLower())
                             select n;
        }
        /// <summary>
        /// Lấy danh sách bài hát thuộc về một đĩa nhạc.
        /// </summary>
        /// <param name="maso">mã đĩa cần xem danh sách bài hát</param>
        /// <returns>Danh sách bài hát thuộc về một đĩa nhạc nếu có.</returns>
        public List<vwDSBaiHat> GetDSBH(int maso)
        {
            List<vwDSBaiHat> get = (from ds in dt.vwDSBaiHats
                                    where ds.MaDia == maso
                                    select ds).ToList<vwDSBaiHat>();
            return get;
        }
        /// <summary>
        /// Lưu dữ liệu sau khi chỉnh sửa .
        /// </summary>
        /// <param name="dgrDanhSach">DataGridView hiển thị danh sách đĩa nhạc.</param>
        public void LuuDuLieu(DataGridView dgrDanhSach)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            if (dgrDanhSach.Rows.Count > 0)
            {
                XuLyForm XL = new XuLyForm();
                dgrDanhSach.EndEdit();
                foreach (DataGridViewRow r in dgrDanhSach.Rows)
                {
                    int ma = ConvertType.ToInt(r.Cells["MaDia"].Value);
                    string tendia = ConvertType.ToString(r.Cells["TenDia"].Value);
                    int loai = ConvertType.ToInt(r.Cells["LoaiDia"].Value);
                    int sl = ConvertType.ToInt(r.Cells["SoLuongDia"].Value);
                    int ncc = ConvertType.ToInt(r.Cells["NhaCungCap"].Value);
                    int gn = ConvertType.ToInt(r.Cells["DonGiaNhap"].Value);
                    int gb = ConvertType.ToInt(r.Cells["DonGiaBan"].Value);
                    DateTime ngay = ConvertType.ToDate(r.Cells["NgapNhapHang"].Value);
                    if (sl < 0)
                        MessageBox.Show("so luong dia cap nhat phai lon hon 0");
                    else
                    {
                        DiaNhac dn = dt.DiaNhacs.Single(t => t.MaDia.Equals(ma));
                        dn.TenDia = tendia;
                        dn.LoaiDia = loai;
                        dn.SoLuongDia = sl;
                        dn.NhaCungCap = ncc;
                        dn.DonGiaNhap = gn;
                        dn.DonGiaBan = gb;
                        dt.SubmitChanges();
                    }
                }


            }
        }
        /// <summary>
        /// Lấy thông tin đĩa nhạc theo mã đĩa
        /// </summary>
        /// <param name="ma">mã đĩa nhạc đưa vào</param>
        /// <returns>Thông tin đĩa nhạc dựa vào mã đưa vào.</returns>
        public static DiaNhac LayDia_Ma(int ma)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            {
                DiaNhac dia;
                dia = (from d in dt.DiaNhacs
                       where d.MaDia == ma
                       select d).Single();

                return dia;
            }
        }
        public static DiaNhac LayDia_Ten(String ten)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            {
                DiaNhac dia;
                dia = (from d in dt.DiaNhacs
                       where d.TenDia.ToLower() == ten.ToLower()
                       select d).First();

                return dia;
            }
        }
        //public static List<DiaNhac> LayDia_Ma_Change(string ma)
        //{
        //    List<DiaNhac> lis = new List<DiaNhac>();
        //    lis = (from dn in dt.vwDiaNhacs
        //                             where dn.MaDia.ToString().Contains(ma)
        //                             select dn).ToList<DiaNhac>();
        //}
        public static int LaySoLuong_Ma(int ma)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            int soluong=0;
            DiaNhac dia;
            dia = (from d in dt.DiaNhacs
                   where d.MaDia == ma
                   select d).Single();
            soluong = dia.SoLuongDia;
            return soluong;
        }
        public static int LaySoLuong_MaCTHD(int mahd)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            int soluong;
            ChiTietHoaDonBanHang dia;
            dia = (from d in dt.ChiTietHoaDonBanHangs
                   where d.MaCTBH == mahd
                   select d).Single();
            soluong = dia.SoLuong;
            return soluong;
        }
        public static int Dochenhlech(int slchinhsua, int ma)
        {
            return slchinhsua - LaySoLuong_MaCTHD(ma);
        }

        public static void CapNhatSoLuong(int ma, int Sldau, int Slban)

        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            int sl = Sldau - Slban;
            dt.DiaNhac_UpdateSoLuong(ma, sl);
            dt.SubmitChanges();
        }
        public static void CapNhatSoLuong(int ma, int soluong)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            dt.DiaNhac_UpdateSoLuong(ma, soluong);
            dt.SubmitChanges();
        }
        //cn.BaiHats.Single(c => c.MaBH.Equals(val)).TenBH + "\n Ca sĩ: " + cn.BaiHats.Single(c => c.MaBH.Equals(val)).CaSi);

        public string TenBH(string val)
        {
          //  dt = new StoreCDDataContext();
            var bh = dt.BaiHats.Single(c => c.MaBH.Equals(val));
            return bh.TenBH;
        }

        public string Casi(string val)
        {
          //  dt = new StoreCDDataContext();
            var bh = dt.BaiHats.Single(c => c.MaBH.Equals(val));
            return bh.CaSi;
        }

        //public static void CapNhatSoLuong(int madia, int soluong)
        //{
        //    dt.DiaNhac_UpdateSoLuong(madia, soluong);
        //    dt.SubmitChanges();
        //}
        public static void ThemDiaNhac(string tendia, int loaidia, int soluong, int nhaCC, decimal gianhap, decimal giaban, DateTime ngaynhap)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            if ((soluong >= 0) && (giaban >= gianhap) && (ngaynhap <= DateTime.Now))
            {
                dt.DiaNhac_Insert(tendia, loaidia, soluong, nhaCC, gianhap, giaban, ngaynhap);
                dt.SubmitChanges();
            }
            else
            {

                if (soluong < 0)
                    throw new InvalidDataException("so luong dia cap nhat phai duong ");
                else
                {
                    if (giaban < gianhap)
                    {
                        throw new InvalidDataException("gia ban phai lon hon gia nhap");
                    }
                    else if (ngaynhap > DateTime.Now)
                        throw new InvalidDataException("ngay nhap phai truoc ngay hien tai");
                }
            }
        }
        public static int LayDiaNhacVuaThem()
        {
            DiaNhac dn = new DiaNhac();
            dn = (from d in dt.DiaNhacs
                  select d).Last();
            return dn.MaDia;


        }
        //cap nhat dia nhac luong sua
        public static void CapNhatDiaNhac(int madia, string tendia, int loaidia, int soluong, int nhaCC, decimal gianhap, decimal giaban, DateTime ngaynhap)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            if ((soluong >= 0) && ((giaban >= gianhap)) && (ngaynhap <= DateTime.Now))
            {
                dt.DiaNhac_Update(madia, tendia, loaidia, soluong, nhaCC, gianhap, giaban, ngaynhap);
                dt.SubmitChanges();
            }
            else
            {
                if (soluong < 0)
                    throw new InvalidDataException("so luong dia cap nhat phai duong ");
                else
                {
                    if (giaban < gianhap)
                    {
                        throw new InvalidDataException("gia ban phai lon hon gia nhap");
                    }
                    else if (ngaynhap > DateTime.Now)
                        throw new InvalidDataException("ngay nhap phai truoc ngay hien tai");
                }
            }
        }

        public static void XoaDiaNhac(int ma)
        {
            dt.DiaNhac_Delete(ma);
            dt.SubmitChanges();
        }

        public string TenDN(int madia)
        {
            var tendn = (from dh in dt.DiaNhacs
                         where dh.MaDia == madia
                         select dh.TenDia).Single();
            return tendn;
        }

        public int TongSoTrang(int pagesize)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            var a = (from t in dt.DiaNhacs
                     select t).Count();
            if (a % pagesize == 0)
            {
                a = (int)a / pagesize;
            }
            else
            {
                a = ((int)a / pagesize) + 1;
            }
            return a;
        }

        public int SoTrangHienTai(int pagenumber, int pagesize)
        {
            int a = pagenumber;
            if (a % pagesize == 0)
            {
                a = (int)a / pagesize;
            }
            else
            {
                a = ((int)a / pagesize) + 1;
            }
            return a + 1;
        }
    }
}
